package bean;


import java.io.Serializable;
import java.sql.*;
import java.util.ResourceBundle;

public class Conexion implements Serializable {
    
	// La descripcion del driver de la BD     
    private static String driver;
    // La direccion URL de la BD
    private static String url;
    // El nombre de la BD
    private static String nombreBd;
    // EL login del usuario para conectarse al servidor de BD
    private static String usuario;
    // EL password del usuario para conectarse al servidor de BD
    private static String password;
 //  El nombre del archivo de properties, donde se encuentran los datos para la conexión con la Base de Datos 
    private static String archivoProperties;

    
    private static Connection conexion;
    
    /**
     * Metodo utilizado para establecer los valores necesarios para la conexion con la Base de Datos     
     */
	public static void establecerPropiedadesConexion(String driver, String url, String nombreBd, String usuario, String password){
		Conexion.driver= driver;
		Conexion.url=url;
		Conexion.nombreBd=nombreBd;
		Conexion.usuario=usuario;
		Conexion.password= password;	
	}
	
    /**
     * Metodo que se encarga de leer los valores valores necesarios para la conexion con la Base de Datos, 
     * de un archivo de configuracion .properties    
     */
	public static void establecerPropiedadesConexion(String archivoProperties, String driver, String url, String nombreBd, String usuario, String password){
		//Obtenemos de un archivo de configuracion .properties los valores de conexion a la Base de Datos
		ResourceBundle bundle =ResourceBundle.getBundle(archivoProperties);

		//Obtenemos las propiedades del archivo de configuracion
		Conexion.driver= bundle.getString(driver);
		Conexion.url=bundle.getString(url);
		Conexion.nombreBd=bundle.getString(nombreBd);
		Conexion.usuario=bundle.getString(usuario);
		Conexion.password= bundle.getString(password);	
	}

	/**
	 * @return  driver
	 */
	public static String getDriver() {
		return driver;
	}

	/**
	 * @param driver
	 */
	public static void setDriver(String driver) {
		Conexion.driver = driver;
	}

	/**
	 * @return url
	 */
	public static String getUrl() {
		return url;
	}

	/**
	 * @param url
	 */
	public static void setUrl(String url) {
		Conexion.url = url;
	}

	/**
	 * @return  bd
	 */
	public static String getNombreBd() {
		return nombreBd;
	}

	/**
	 * @param bd 
	 */
	public static void setNombreBd(String nombreBd) {
		Conexion.nombreBd = nombreBd;
	}

	/**
	 * @return  usuario
	 */
	public static String getUsuario() {
		return usuario;
	}

	/**
	 * @param usuario
	 */
	public static void setUsuario(String usuario) {
		Conexion.usuario = usuario;
	}

	/**
	 * @return password
	 */
	public static String getPassword() {
		return password;
	}

	/**
	 * @param password 
	 */
	public static void setPassword(String password) {
		Conexion.password = password;
	}



	/**
     * Metodo utilizado para Obtener una conexion a BD
     * @return Un objeto tipo Connection que representa una conexion a la BD
     */
    private static Connection getConexion() {
    	try{
    		if (conexion == null || conexion.isClosed()) {	        
	        	// Cargo el driver en memoria
	            Class.forName(driver);
	            // Establezco la conexion
	            conexion=DriverManager.getConnection(url+nombreBd,usuario,password);
	        }
    	}
        catch(SQLException e){
        	e.printStackTrace();
        } 
        catch (ClassNotFoundException e) {
        	e.printStackTrace();
		}
        return conexion;
    }

    /** * Metodo consultar
     * @param String tiraSQL
     * @return ResultSet
     */ 
    public static ResultSet consultar(String tiraSQL) {
    	getConexion();
        ResultSet resultado = null;                
        try {
            Statement sentencia= conexion.createStatement();
            resultado = sentencia.executeQuery(tiraSQL);            
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        try {  
            conexion.close();            	
        }
        catch( SQLException e ) {
        	e.printStackTrace();
        }        
        return resultado;
    }

    /** * Metodo ejecutar
     * @param String TiraSQL
     * @return boolean
     */     
    public static boolean ejecutar(String tiraSQL) {
        getConexion();
        boolean ok = false;
        try {
            Statement sentencia = conexion.createStatement();
            int i = sentencia.executeUpdate(tiraSQL);
            if (i > 0) {
            	ok = true;
            }
            sentencia.close ();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    	try {  
          conexion.close();
        }
        catch( SQLException e ) {
        	e.printStackTrace();
        }
        return ok;  
    }
}